﻿using System.Threading.Tasks;
using EasyNetQ;

namespace Aquarinum.Base.Infrastructure.EventBus.Interfaces
{
    /// <summary>
    /// 定义事件处理器公共接口，所有的事件处理都要实现该接口
    /// <remarks>
    /// 关于easynetq 订阅的策略 
    /// 1，根据类型名称建立唯一的exchage，用于路由消息到对应队列
    /// 2，根据唯一订阅ID 生成 类型名+订阅id 生成消费者队列
    /// 3，在PUBLISH 时 会根据topic 机制把对应类型名的消息推送到相关的队列（类型名+订阅ID的订阅者队列和类型名的单独队列）
    /// 4，订阅只会接受到类型名+自己订阅ID 的消息（合理运用topic 机制可以用于广播对应接口或者基类下所有订阅）
    /// </remarks>
    /// </summary>
    public interface IEventHandler
    {
    }

    /// <summary>
    /// 泛型事件处理器接口
    /// </summary>
    /// <typeparam name="TEventData"></typeparam>
    public interface IEventHandler<in TEventData> : IEventHandler where TEventData : IEventData
    {
        /// <summary>
        /// 事件处理器实现该方法来处理事件
        /// </summary>
        /// <param name="eventData"></param>
        void HandleEvent(TEventData eventData);

        /// <summary>
        /// 事件处理器实现该方法来异步处理事件
        /// </summary>
        Task HandleEventAsync(TEventData eventData);
    }

    
}